/**
 * 系统配置Token助手
 * 功能：从数据库读取系统配置的token（百度网盘、Authorization等）
 * 特性：使用内存缓存，5分钟刷新一次，减少数据库查询
 */

const systemConfigModel = require('../models/systemConfig');

// 内存缓存
const tokenCache = {
    baidu_token: { value: null, lastUpdate: 0 },
    baidu_bdstoken: { value: null, lastUpdate: 0 },
    baidu_logid: { value: null, lastUpdate: 0 },
    baidu_cookie: { value: null, lastUpdate: 0 },
    authorization: { value: null, lastUpdate: 0 },
    course_price_mode: { value: '0', lastUpdate: 0 }, // 课件价格模式：0=免费，1=原价
    ios_can_in: { value: '1', lastUpdate: 0 } // iOS功能开关：1=可用，0=不可用
};

// 缓存有效期：5分钟（毫秒）
const CACHE_DURATION = 5 * 60 * 1000;

/**
 * 从数据库获取配置值（带缓存）
 * @param {string} configKey - 配置键
 * @returns {Promise<string>} 配置值
 */
async function getConfigValue(configKey) {
    const now = Date.now();
    const cache = tokenCache[configKey];

    // 检查缓存是否有效
    if (cache && cache.value && (now - cache.lastUpdate < CACHE_DURATION)) {
        return cache.value;
    }

    // 从数据库读取
    try {
        const config = await systemConfigModel.findOne({
            where: { configKey }
        });

        if (!config) {
            throw new Error(`配置项 ${configKey} 不存在`);
        }

        // 更新缓存
        tokenCache[configKey] = {
            value: config.configValue,
            lastUpdate: now
        };

        return config.configValue;

    } catch (error) {
        console.error(`获取配置 ${configKey} 失败:`, error.message);
        // 如果数据库读取失败，尝试返回缓存的旧值
        if (cache && cache.value) {
            console.log(`使用缓存的旧值: ${configKey}`);
            return cache.value;
        }
        throw error;
    }
}

/**
 * 获取百度网盘Token
 * @returns {Promise<string>} 百度网盘access_token
 */
async function getBaiduToken() {
    return await getConfigValue('baidu_token');
}

/**
 * 获取百度网盘Bdstoken
 * @returns {Promise<string>} 百度网盘bdstoken
 */
async function getBaiduBdstoken() {
    return await getConfigValue('baidu_bdstoken');
}

/**
 * 获取百度网盘Logid
 * @returns {Promise<string>} 百度网盘dp-logid
 */
async function getBaiduLogid() {
    return await getConfigValue('baidu_logid');
}

/**
 * 获取百度网盘Cookie
 * @returns {Promise<string>} 百度网盘Cookie
 */
async function getBaiduCookie() {
    return await getConfigValue('baidu_cookie');
}

/**
 * 获取全局Authorization
 * @returns {Promise<string>} Authorization值
 */
async function getAuthorization() {
    return await getConfigValue('authorization');
}

/**
 * 清除指定配置的缓存
 * @param {string} configKey - 配置键，不传则清除所有缓存
 */
function clearCache(configKey) {
    if (configKey) {
        tokenCache[configKey] = { value: null, lastUpdate: 0 };
        console.log(`缓存已清除: ${configKey}`);
    } else {
        // 清除所有缓存
        Object.keys(tokenCache).forEach(key => {
            tokenCache[key] = { value: null, lastUpdate: 0 };
        });
        console.log('所有token缓存已清除');
    }
}

/**
 * 获取课件价格模式（异步）
 * @returns {Promise<string>} '0'=全部免费, '1'=显示原价
 */
async function getCoursePriceMode() {
    return await getConfigValue('course_price_mode');
}

/**
 * 同步获取课件价格模式（从缓存读取）
 * 注意：仅返回缓存值，不查询数据库
 * @returns {string} '0'=全部免费, '1'=显示原价
 */
function getCoursePriceModeSync() {
    const cache = tokenCache['course_price_mode'];
    return cache && cache.value ? cache.value : '0'; // 默认返回'0'（免费）
}

/**
 * 获取 iOS 功能开关（异步）
 * @returns {Promise<string>} '1'=iOS可用, '0'=iOS不可用
 */
async function getIosCanIn() {
    return await getConfigValue('ios_can_in');
}

/**
 * 同步获取 iOS 功能开关（从缓存读取）
 * @returns {string} '1'=iOS可用, '0'=iOS不可用
 */
function getIosCanInSync() {
    const cache = tokenCache['ios_can_in'];
    return cache && cache.value ? cache.value : '1'; // 默认返回'1'（可用）
}

/**
 * 初始化配置缓存（应用启动时调用）
 * 预加载所有配置到缓存
 */
async function initConfigCache() {
    try {
        // 预加载课件价格模式
        await getCoursePriceMode();
        // 预加载 iOS 功能开关
        await getIosCanIn();
        console.log('✓ 系统配置缓存初始化完成');
    } catch (error) {
        console.error('⚠️  系统配置缓存初始化失败:', error.message);
    }
}

/**
 * 获取配置详情（包含过期时间等）
 * @param {string} configKey - 配置键
 * @returns {Promise<Object>} 配置对象
 */
async function getConfigDetail(configKey) {
    const config = await systemConfigModel.findOne({
        where: { configKey }
    });
    return config;
}

module.exports = {
    getBaiduToken,
    getBaiduBdstoken,
    getBaiduLogid,
    getBaiduCookie,
    getAuthorization,
    getCoursePriceMode,
    getCoursePriceModeSync,
    getIosCanIn,
    getIosCanInSync,
    initConfigCache,
    clearCache,
    getConfigDetail
};
